#ifndef		_BSP_LED_H
#define		_BSP_LED_H
#include "stm32f10x.h"
//使用宏的好处就是，一处修改，处处修改

/**************************LED灯亮灭的宏定义*****************************(与驱动硬件的方法打交道)*******/
//直接操作寄存器的方法控制IO   这里的i即任意GPIO_Pin_x (x=0..15)的组合
#define	digitalHi(p,i)		{p->BSRR=i;}     //(输出电平为高)这种宏定义的方法
#define	digitalLo(p,i)		{p->BRR=i;}     //输出电平为低
#define	digitalToggle(p,i)	{p->ODR^=i;}    //与1异或即取反


/****************下面定义一下位带操作相关的宏****************(现在是4个字节控制一个bit)**/
//把"位带地址+位序号"转换成别名区地址的宏
#define BITBAND(addr,bitnum)	((addr&0xF0000000)+0x02000000+((addr&0x00FFFFFF)<<5)+(bitnum<<2))  //宏定义时要格外注意括号的使用
//将一个立即数转换成对应的寄存器
#define	MEM_ADDR(addr)	*((volatile uint32_t *)(addr))    //立即数->地址变量->相应的寄存器
//上面的组合	利用位带别名区实现对位带的访问
#define	BIT_ADDR(addr,bitnum)	MEM_ADDR(BITBAND(addr,bitnum))

//GPIO  ODR 和  IDR寄存器地址映射
#define	GPIOA_ODR_Addr	(GPIOA_BASE+12)         //GPIOx_BASE (x=A...G)库函数里有定义
#define	GPIOB_ODR_Addr	(GPIOB_BASE+12)  
#define	GPIOC_ODR_Addr	(GPIOC_BASE+12)  
#define	GPIOD_ODR_Addr	(GPIOD_BASE+12)  
#define	GPIOE_ODR_Addr	(GPIOE_BASE+12)  
#define	GPIOF_ODR_Addr	(GPIOF_BASE+12)  
#define	GPIOG_ODR_Addr	(GPIOG_BASE+12)  

#define	GPIOA_IDR_Addr	(GPIOA_BASE+8)
#define	GPIOB_IDR_Addr	(GPIOB_BASE+8)
#define	GPIOC_IDR_Addr	(GPIOC_BASE+8)
#define	GPIOD_IDR_Addr	(GPIOD_BASE+8)
#define	GPIOE_IDR_Addr	(GPIOE_BASE+8)
#define	GPIOF_IDR_Addr	(GPIOF_BASE+8)
#define	GPIOG_IDR_Addr	(GPIOG_BASE+8)

//GPIO位操作,单独操作GPIO的某一个IO口
#define	PAOut(n)	BIT_ADDR(GPIOA_ODR_Addr,n)
#define	PAIn(n)		BIT_ADDR(GPIOA_IDR_Addr,n)

#define	PBOut(n)	BIT_ADDR(GPIOB_ODR_Addr,n)
#define	PBIn(n)		BIT_ADDR(GPIOB_IDR_Addr,n)

#define	PCOut(n)	BIT_ADDR(GPIOC_ODR_Addr,n)
#define	PCIn(n)		BIT_ADDR(GPIOC_IDR_Addr,n)

#define	PDOut(n)	BIT_ADDR(GPIOD_ODR_Addr,n)
#define	PDIn(n)		BIT_ADDR(GPIOD_IDR_Addr,n)

#define	PEOut(n)	BIT_ADDR(GPIOE_ODR_Addr,n)
#define	PEIn(n)		BIT_ADDR(GPIOE_IDR_Addr,n)

#define	PFOut(n)	BIT_ADDR(GPIOF_ODR_Addr,n)
#define	PFIn(n)		BIT_ADDR(GPIOF_IDR_Addr,n)

#define	PGOut(n)	BIT_ADDR(GPIOG_ODR_Addr,n)
#define	PGIn(n)		BIT_ADDR(GPIOG_IDR_Addr,n)

#define	RX_LED_GPIO_PORT		GPIOC
#define	RX_LED_GPIO_PIN			GPIO_Pin_7
#define	RX_LED_GPIO_CLK	        RCC_APB2Periph_GPIOC

#define	TX_LED_GPIO_PORT		GPIOC
#define	TX_LED_GPIO_PIN			GPIO_Pin_6		
#define	TX_LED_GPIO_CLK	        RCC_APB2Periph_GPIOC

#define RX_LED_ON               digitalLo(RX_LED_GPIO_PORT,RX_LED_GPIO_PIN)
#define RX_LED_OFF              digitalHi(RX_LED_GPIO_PORT,RX_LED_GPIO_PIN)

#define TX_LED_ON               digitalLo(TX_LED_GPIO_PORT,TX_LED_GPIO_PIN)
#define TX_LED_OFF              digitalHi(TX_LED_GPIO_PORT,TX_LED_GPIO_PIN)

void  LED_TX_Action(void);
void  LED_RX_Action(void);
void  LED_Action(void);
void LED_GPIO_Config(void);

#endif

